home *** CD-ROM | disk | FTP | other *** search
- // **************************************************************
- // sort1.cpp
- // Example program for Simple C++
- //
- // (c) 1999 Emmenjay Consulting Pty Ltd
- //
- // History
- // 04/06/99 MJS Initial Coding.
- //
- // **************************************************************
-
- #include <iostream>
- #include <cstring>
-
-
- void DeleteData( char ** &data, int NumLines );
-
- // ALLOCATE A NEW DATA ARRAY, FREEING THE
- // OLD ONE
- int Expand( char ** &data, int &siz,
- int newsiz )
- {
- char **newdat = new char * [newsiz];
- int i;
-
- if (newdat==NULL) {
- // ALLOCATION FAILED
- return 0;
- }
-
- if (siz>0) {
- // COPY THE OLD DATA TO THE NEW
- for (i=0; i<siz; i++)
- newdat[i] = data[i];
- // DELETE THE OLD DATA
- delete [] data;
- }
-
- // SET NEW (UNINITIALISED)
- // POINTERS TO NULL
- for (i=siz; i<newsiz; i++)
- newdat[i] = NULL;
-
- // SET VALUES TO RETURN
- data = newdat;
- siz = newsiz;
-
- return 1;
- }
-
- // MAKE A DUPLICATE OF A STRING
- char *DupStr( char *str )
- {
- char *newstr =
- new char [strlen(str)+1];
-
- if (newstr)
- strcpy( newstr, str );
-
- return newstr;
- }
-
- int ReadData( char ** &data )
- {
- const int LINELEN = 256;
- int NumLines = 0;
- int MaxLines = 0;
- char buffer[LINELEN];
-
- Expand( data, MaxLines, 100 );
-
- while (!std::cin.eof()) {
- std::cin.getline( buffer, LINELEN );
- if (NumLines==MaxLines) {
- // OUT OF POINTERS, ALLOCATE SOME MORE
- if (!Expand(data, MaxLines, MaxLines*2)) {
- DeleteData( data, NumLines );
- return 0;
- }
- }
- // COPY THE STRING
- data[NumLines] = DupStr( buffer );
- if (data[NumLines]==NULL) {
- // COPY FAILED (NO MEMORY)
- DeleteData( data, NumLines );
- return 0;
- }
- NumLines++;
- }
-
- return NumLines;
- }
-
- // STANDARD INSERTION SORT
- // ADAPTED FROM SEDGEWICK'S
- // ALGORITHMS IN C++
- void SortData( char **data, int NumLines )
- {
- for (int i=1; i<NumLines; i++) {
- char *tmp;
- int j;
-
- tmp = data[i];
- j = i;
- while (j>0 && strcmp(data[j-1],tmp)>0) {
- data[j] = data[j-1];
- j--;
- }
- data[j] = tmp;
- }
- }
-
- void WriteData( char **data, int NumLines )
- {
- for (int i=0; i<NumLines; i++)
- std::cout << data[i] << '\n';
- }
-
- void DeleteData( char ** &data, int NumLines )
- {
- if (data) {
- // ARRAY OF POINTERS IS VALID
- for (int i=0; i<NumLines; i++)
- // DELETE EACH VALID STRING
- if (data[i])
- delete data[i];
- // DELETE ARRAY OF POINTERS
- delete [] data;
- data = NULL;
- }
- }
-
- int main( void )
- {
- char **data;
- int NumLines;
-
- NumLines = ReadData( data );
- if (!NumLines)
- return 1;
- SortData( data, NumLines );
- WriteData( data, NumLines );
- DeleteData( data, NumLines );
-
- return 0;
- }
-